//@version=5
indicator("ISTERNET_STR1_Ust_11", overlay=true,max_lines_count = 500, max_labels_count = 500, max_bars_back=500)

AUTO = "Auto"
DAILY = "Daily"
WEEKLY = "Weekly"
MONTHLY = "Monthly"
QUARTERLY = "Quarterly"
YEARLY = "Yearly"
BIYEARLY = "Biyearly"
TRIYEARLY = "Triyearly"
QUINQUENNIALLY = "Quinquennially"
DECENNIALLY = "Decennially"
TRADITIONAL = "Traditional"
FIBONACCI = "Fibonacci"
WOODIE = "Woodie"
CLASSIC = "Classic"
DEMARK = "DM"
CAMARILLA = "Camarilla"

kind = input.string(title="Type", defval="Traditional", options=[TRADITIONAL, FIBONACCI, WOODIE, CLASSIC, DEMARK, CAMARILLA])
pivot_time_frame = input.string(title="Pivots Timeframe", defval=AUTO, options=[AUTO, DAILY, WEEKLY, MONTHLY, QUARTERLY, YEARLY, BIYEARLY, TRIYEARLY, QUINQUENNIALLY, DECENNIALLY])
look_back = input.int(title="Number of Pivots Back", defval=3, minval=1, maxval=5000)
is_daily_based = input.bool(title="Use Daily-based Values", defval=true, tooltip="When this option is unchecked, Pivot Points will use intraday data while calculating on intraday charts. If Extended Hours are displayed on the chart, they will be taken into account during the pivot level calculation. If intraday OHLC values are different from daily-based values (normal for stocks), the pivot levels will also differ.")
show_labels = input.bool(title="Show Labels", defval=true, inline="labels")
position_labels = input.string("Left", "", options=["Left", "Right"], inline="labels")

var DEF_COLOR = color.rgb(23, 64, 179)
var arr_time = array.new_int()
var p = array.new_float()
p_show = input.bool(false, "P‏  ‏  ‏  ‏  ‏  ‏  ‏  ‏", inline="P")
p_color = input.color(DEF_COLOR, "", inline="P")
var r1 = array.new_float()
var s1 = array.new_float()
s1r1_show = input.bool(false, "S1/R1", inline="S1/R1")
s1r1_color = input.color(DEF_COLOR, "", inline="S1/R1")
var r2 = array.new_float()
var s2 = array.new_float()
s2r2_show = input.bool(false, "S2/R2", inline="S2/R2")
s2r2_color = input.color(DEF_COLOR, "", inline="S2/R2")
var r3 = array.new_float()
var s3 = array.new_float()
s3r3_show = input.bool(false, "S3/R3", inline="S3/R3")
s3r3_color = input.color(DEF_COLOR, "", inline="S3/R3")
var r4 = array.new_float()
var s4 = array.new_float()
s4r4_show = input.bool(false, "S4/R4", inline="S4/R4")
s4r4_color = input.color(DEF_COLOR, "", inline="S4/R4")
var r5 = array.new_float()
var s5 = array.new_float()
s5r5_show = input.bool(false, "S5/R5", inline="S5/R5")
s5r5_color = input.color(DEF_COLOR, "", inline="S5/R5")
pivotX_open = float(na)
pivotX_open := nz(pivotX_open[1], open)
pivotX_high = float(na)
pivotX_high := nz(pivotX_high[1], high)
pivotX_low = float(na)
pivotX_low := nz(pivotX_low[1], low)
pivotX_prev_open = float(na)
pivotX_prev_open := nz(pivotX_prev_open[1])
pivotX_prev_high = float(na)
pivotX_prev_high := nz(pivotX_prev_high[1])
pivotX_prev_low = float(na)
pivotX_prev_low := nz(pivotX_prev_low[1])
pivotX_prev_close = float(na)
pivotX_prev_close := nz(pivotX_prev_close[1])

get_pivot_resolution() =>
    resolution = "M"
    if pivot_time_frame == AUTO
        if timeframe.isintraday
            resolution := timeframe.multiplier <= 15 ? "D" : "W"
        else if timeframe.isweekly or timeframe.ismonthly
            resolution := "12M"
    else if pivot_time_frame == DAILY
        resolution := "D"
    else if pivot_time_frame == WEEKLY
        resolution := "W"
    else if pivot_time_frame == MONTHLY
        resolution := "M"
    else if pivot_time_frame == QUARTERLY
        resolution := "3M"
    else if pivot_time_frame == YEARLY or pivot_time_frame == BIYEARLY or pivot_time_frame == TRIYEARLY or pivot_time_frame == QUINQUENNIALLY or pivot_time_frame == DECENNIALLY
        resolution := "12M"
    resolution

var lines = array.new_line()
var labels = array.new_label()

draw_line(i, pivot, col) =>
    if array.size(arr_time) > 1
        array.push(lines, line.new(array.get(arr_time, i), array.get(pivot, i), array.get(arr_time, i + 1), array.get(pivot, i), color=col, xloc=xloc.bar_time))

draw_label(i, y, txt, txt_color) =>
    if show_labels
        offset = '‏  ‏  ‏  ‏  ‏'
        labels_align_str_left= position_labels == "Left" ? txt + offset : offset + txt
        x = position_labels == "Left" ? array.get(arr_time, i) : array.get(arr_time, i + 1)
        array.push(labels, label.new(x = x, y=y, text=labels_align_str_left, textcolor=txt_color, style=label.style_label_center, color=#00000000, xloc=xloc.bar_time))

traditional() =>
    pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close) / 3
    array.push(p, pivotX_Median)
    array.push(r1, pivotX_Median * 2 - pivotX_prev_low)
    array.push(s1, pivotX_Median * 2 - pivotX_prev_high)
    array.push(r2, pivotX_Median + 1 * (pivotX_prev_high - pivotX_prev_low))
    array.push(s2, pivotX_Median - 1 * (pivotX_prev_high - pivotX_prev_low))
    array.push(r3, pivotX_Median * 2 + (pivotX_prev_high - 2 * pivotX_prev_low))
    array.push(s3, pivotX_Median * 2 - (2 * pivotX_prev_high - pivotX_prev_low))
    array.push(r4, pivotX_Median * 3 + (pivotX_prev_high - 3 * pivotX_prev_low))
    array.push(s4, pivotX_Median * 3 - (3 * pivotX_prev_high - pivotX_prev_low))
    array.push(r5, pivotX_Median * 4 + (pivotX_prev_high - 4 * pivotX_prev_low))
    array.push(s5, pivotX_Median * 4 - (4 * pivotX_prev_high - pivotX_prev_low))

fibonacci() =>
    pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close) / 3
    pivot_range = pivotX_prev_high - pivotX_prev_low
    array.push(p, pivotX_Median)
    array.push(r1, pivotX_Median + 0.382 * pivot_range)
    array.push(s1, pivotX_Median - 0.382 * pivot_range)
    array.push(r2, pivotX_Median + 0.618 * pivot_range)
    array.push(s2, pivotX_Median - 0.618 * pivot_range)
    array.push(r3, pivotX_Median + 1 * pivot_range)
    array.push(s3, pivotX_Median - 1 * pivot_range)

woodie() =>
    pivotX_Woodie_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_open * 2)/4
    pivot_range = pivotX_prev_high - pivotX_prev_low
    array.push(p, pivotX_Woodie_Median)
    array.push(r1, pivotX_Woodie_Median * 2 - pivotX_prev_low)
    array.push(s1, pivotX_Woodie_Median * 2 - pivotX_prev_high)
    array.push(r2, pivotX_Woodie_Median + 1 * pivot_range)
    array.push(s2, pivotX_Woodie_Median - 1 * pivot_range)

    pivot_point_r3 = pivotX_prev_high + 2 * (pivotX_Woodie_Median - pivotX_prev_low)
    pivot_point_s3 = pivotX_prev_low - 2 * (pivotX_prev_high - pivotX_Woodie_Median)
    array.push(r3, pivot_point_r3)
    array.push(s3, pivot_point_s3)
    array.push(r4, pivot_point_r3 + pivot_range)
    array.push(s4, pivot_point_s3 - pivot_range)

classic() =>
    pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close)/3
    pivot_range = pivotX_prev_high - pivotX_prev_low
    array.push(p, pivotX_Median)
    array.push(r1, pivotX_Median * 2 - pivotX_prev_low)
    array.push(s1, pivotX_Median * 2 - pivotX_prev_high)
    array.push(r2, pivotX_Median + 1 * pivot_range)
    array.push(s2, pivotX_Median - 1 * pivot_range)
    array.push(r3, pivotX_Median + 2 * pivot_range)
    array.push(s3, pivotX_Median - 2 * pivot_range)
    array.push(r4, pivotX_Median + 3 * pivot_range)
    array.push(s4, pivotX_Median - 3 * pivot_range)

demark() =>
    pivotX_Demark_X = pivotX_prev_high + pivotX_prev_low * 2 + pivotX_prev_close
    if pivotX_prev_close == pivotX_prev_open
        pivotX_Demark_X := pivotX_prev_high + pivotX_prev_low + pivotX_prev_close * 2
    if pivotX_prev_close > pivotX_prev_open
        pivotX_Demark_X := pivotX_prev_high * 2 + pivotX_prev_low + pivotX_prev_close
    array.push(p, pivotX_Demark_X / 4)
    array.push(r1, pivotX_Demark_X / 2 - pivotX_prev_low)
    array.push(s1, pivotX_Demark_X / 2 - pivotX_prev_high)

camarilla() =>
    pivotX_Median = (pivotX_prev_high + pivotX_prev_low + pivotX_prev_close) / 3
    pivot_range = pivotX_prev_high - pivotX_prev_low
    array.push(p, pivotX_Median)
    array.push(r1, pivotX_prev_close + pivot_range * 1.1 / 12.0)
    array.push(s1, pivotX_prev_close - pivot_range * 1.1 / 12.0)
    array.push(r2, pivotX_prev_close + pivot_range * 1.1 / 6.0)
    array.push(s2, pivotX_prev_close - pivot_range * 1.1 / 6.0)
    array.push(r3, pivotX_prev_close + pivot_range * 1.1 / 4.0)
    array.push(s3, pivotX_prev_close - pivot_range * 1.1 / 4.0)
    array.push(r4, pivotX_prev_close + pivot_range * 1.1 / 2.0)
    array.push(s4, pivotX_prev_close - pivot_range * 1.1 / 2.0)

resolution = get_pivot_resolution()

[sec_open, sec_high, sec_low, sec_close] = request.security(syminfo.tickerid, resolution, [open, high, low, close], lookahead = barmerge.lookahead_on)
sec_open_gaps_on = request.security(syminfo.tickerid, resolution, open, gaps = barmerge.gaps_on, lookahead = barmerge.lookahead_on)

custom_years_divisor = switch pivot_time_frame
	BIYEARLY => 2
	TRIYEARLY => 3
	QUINQUENNIALLY => 5
	DECENNIALLY => 10
	=> -1

is_change_years = false	
if custom_years_divisor > 0 and ta.change(time(resolution))
	is_change_years := year % custom_years_divisor == 0



var is_change = false
var uses_current_bar = timeframe.isintraday and kind == WOODIE
var change_time = int(na)
is_time_change = (ta.change(time(resolution)) and custom_years_divisor == -1) or is_change_years
if is_time_change
    change_time := time


if (not uses_current_bar and is_time_change) or (uses_current_bar and not na(sec_open_gaps_on))
    if is_daily_based and custom_years_divisor == -1
        pivotX_prev_open := sec_open[1]
        pivotX_prev_high := sec_high[1]
        pivotX_prev_low := sec_low[1]
        pivotX_prev_close := sec_close[1]
        pivotX_open := sec_open
        pivotX_high := sec_high
        pivotX_low := sec_low
    else
        pivotX_prev_high := pivotX_high
        pivotX_prev_low := pivotX_low
        pivotX_prev_open := pivotX_open
        pivotX_open := open
        pivotX_high := high
        pivotX_low := low
        pivotX_prev_close := close[1]

    if barstate.islast and not is_change and  array.size(arr_time) > 0
        array.set(arr_time, array.size(arr_time) - 1, change_time)
    else
        array.push(arr_time, change_time)

    if kind == TRADITIONAL
        traditional()
    else if kind == FIBONACCI
        fibonacci()
    else if kind == WOODIE
        woodie()
    else if kind == CLASSIC
        classic()
    else if kind == DEMARK
        demark()
    else if kind == CAMARILLA
        camarilla()

    if array.size(arr_time) > look_back
        if array.size(arr_time) > 0
            array.shift(arr_time)
        if array.size(p) > 0 and p_show
            array.shift(p)
        if array.size(r1) > 0 and s1r1_show
            array.shift(r1)
        if array.size(s1) > 0 and s1r1_show
            array.shift(s1)
        if array.size(r2) > 0 and s2r2_show
            array.shift(r2)
        if array.size(s2) > 0 and s2r2_show
            array.shift(s2)
        if array.size(r3) > 0 and s3r3_show
            array.shift(r3)
        if array.size(s3) > 0 and s3r3_show
            array.shift(s3)
        if array.size(r4) > 0 and s4r4_show
            array.shift(r4)
        if array.size(s4) > 0 and s4r4_show
            array.shift(s4)
        if array.size(r5) > 0 and s5r5_show
            array.shift(r5)
        if array.size(s5) > 0 and s5r5_show
            array.shift(s5)
    is_change := true
else
    if is_daily_based and custom_years_divisor == -1
        pivotX_high := math.max(pivotX_high, sec_high)
        pivotX_low := math.min(pivotX_low, sec_low)
    else
        pivotX_high := math.max(pivotX_high, high)
        pivotX_low := math.min(pivotX_low, low)

if barstate.islast and array.size(arr_time) > 0 and is_change
    is_change := false
    if array.size(arr_time) > 2 and custom_years_divisor > 0
        last_pivot_time = array.get(arr_time, array.size(arr_time) - 1)
        prev_pivot_time = array.get(arr_time, array.size(arr_time) - 2)
        estimate_pivot_time = last_pivot_time - prev_pivot_time
        array.push(arr_time, last_pivot_time + estimate_pivot_time)
    else
        array.push(arr_time, time_close(resolution))

    for i = 0 to array.size(lines) - 1
        if array.size(lines) > 0
            line.delete(array.shift(lines))
        if array.size(lines) > 0
            label.delete(array.shift(labels))

    for i = 0 to array.size(arr_time) - 2
        if array.size(p) > 0 and p_show
            draw_line(i, p, p_color)
            draw_label(i, array.get(p, i), "P", p_color)
        if array.size(r1) > 0 and s1r1_show
            draw_line(i, r1, s1r1_color)
            draw_label(i, array.get(r1, i), "R1", s1r1_color)
        if array.size(s1) > 0 and s1r1_show
            draw_line(i, s1, s1r1_color)
            draw_label(i, array.get(s1, i), "S1", s1r1_color)
        if array.size(r2) > 0 and s2r2_show
            draw_line(i, r2, s2r2_color)
            draw_label(i, array.get(r2, i), "R2", s2r2_color)
        if array.size(s2) > 0 and s2r2_show
            draw_line(i, s2, s2r2_color)
            draw_label(i, array.get(s2, i), "S2", s2r2_color)
        if array.size(r3) > 0 and s3r3_show
            draw_line(i, r3, s3r3_color)
            draw_label(i, array.get(r3, i), "R3", s3r3_color)
        if array.size(s3) > 0 and s3r3_show
            draw_line(i, s3, s3r3_color)
            draw_label(i, array.get(s3, i), "S3", s3r3_color)
        if array.size(r4) > 0 and s4r4_show
            draw_line(i, r4, s4r4_color)
            draw_label(i, array.get(r4, i), "R4", s4r4_color)
        if array.size(s4) > 0 and s4r4_show
            draw_line(i, s4, s4r4_color)
            draw_label(i, array.get(s4, i), "S4", s4r4_color)
        if array.size(r5) > 0 and s5r5_show
            draw_line(i, r5, s5r5_color)
            draw_label(i, array.get(r5, i), "R5", s5r5_color)
        if array.size(s5) > 0 and s5r5_show
            draw_line(i, s5, s5r5_color)
            draw_label(i, array.get(s5, i), "S5", s5r5_color)

//////////////////////////////////////////////////////////////////

left = 50
right = 25
quick_right = 5 // Used to try and detect a more recent significant swing.


lengthBB1 = input.int(20, minval=1 ,title="length")
multBB1 = input.float(2.0, minval=0.001, maxval=50, title="StdDev")

pivot_high = ta.pivothigh(high,left,right)
pivot_lows = ta.pivotlow(low, left,right)

quick_pivot_high = ta.pivothigh(high,left,quick_right)
quick_pivot_lows = ta.pivotlow(low, left,quick_right)

level1 = ta.valuewhen(quick_pivot_high, high[quick_right], 0)
level2 = ta.valuewhen(quick_pivot_lows, low[quick_right], 0)
level3 = ta.valuewhen(pivot_high, high[right], 0)
level4 = ta.valuewhen(pivot_lows, low[right], 0)
level5 = ta.valuewhen(pivot_high, high[right], 1)
level6 = ta.valuewhen(pivot_lows, low[right], 1)
level7 = ta.valuewhen(pivot_high, high[right], 2)
level8 = ta.valuewhen(pivot_lows, low[right], 2)

level1_col = close >= level1 ? color.green : color.red
level2_col = close >= level2 ? color.green : color.red
level3_col = close >= level3 ? color.green : color.red
level4_col = close >= level4 ? color.green : color.red
level5_col = close >= level5 ? color.green : color.red
level6_col = close >= level6 ? color.green : color.red
level7_col = close >= level7 ? color.green : color.red
level8_col = close >= level8 ? color.green : color.red


plot(level1, style= plot.style_circles, color=level1_col, show_last=1, linewidth=3, trackprice=true,display = display.none)
plot(level2, style= plot.style_circles, color=level2_col, show_last=1, linewidth=3, trackprice=true,display = display.none)
plot(level3, style= plot.style_circles, color=level3_col, show_last=1, linewidth=3, trackprice=true,display = display.none)
plot(level4, style= plot.style_circles, color=level4_col, show_last=1, linewidth=3, trackprice=true,display = display.none)
plot(level5, style= plot.style_circles, color=level5_col, show_last=1, linewidth=3, trackprice=true,display = display.none)
plot(level6, style= plot.style_circles, color=level6_col, show_last=1, linewidth=3, trackprice=true,display = display.none)
plot(level7, style= plot.style_circles, color=level7_col, show_last=1, linewidth=3, trackprice=true,display = display.none)
plot(level8, style= plot.style_circles, color=level8_col, show_last=1, linewidth=3, trackprice=true,display = display.none)

length = input.int(9, minval=1)
mah = ta.ema(high, length)
mal = ta.ema(low, length)
u = plot(mah, color=color.orange, title="Upper",linewidth=2,trackprice=true,display = display.none)
l = plot(mal, color=color.orange, title="Lower",linewidth=2,trackprice=true,display = display.none)


openha = (high[3]+low[3])/2
closeha = close
AL= openha < closeha 
SAT= openha > closeha 

plotshape((AL ? SAT[1] : na), text="AL", location=location.belowbar, style=shape.labelup, size=size.tiny, color=color.green, textcolor=color.white,display = display.none)
plotshape((SAT ? AL[1] : na), text="SAT", location=location.abovebar, style=shape.labeldown, size=size.tiny, color=color.red, textcolor=color.white,display = display.none)




// BB Girdileri
drawBB = input(true, title = "═══════ Bolinger Bands")
lengthBB = input.int(20, minval=1 ,title="length")
multBB = input.float(2.0, minval=0.001, maxval=50, title="StdDev")
// BB Hesapları
srcBB = input(close, title="Source")
basisBB = ta.sma(srcBB, lengthBB)
devBB = multBB * ta.stdev(srcBB, lengthBB)
upper = basisBB + devBB
lower = basisBB - devBB
offset = input.int(0, "Offset", minval = -500, maxval = 500)
// BB Çizimi
plot(basisBB, color=drawBB ? #0000CD:na, title="BB Orta",  linewidth=2, offset = offset)
p1 = plot(upper, color=drawBB ? #F50057:na , title="BB Üst", linewidth=2, offset = offset)
p2 = plot(lower, color=drawBB ? #0000CD:na , title="BB Alt", linewidth=2, offset = offset)



// *** MAVILIM *****
drawM1 = input(false, title="═══════ Mavilim W", group="Mavilim W")
fmal=input(3,"1. Mavilim hareketli ortalama")
smal=input(5,"2. Mavilim hareketli ortalama")
tmal=fmal+smal
Fmal=smal+tmal
Ftmal=tmal+Fmal
Smal=Fmal+Ftmal
mavilimold = input(false, title="═══════ Mavilim önceki versiyon", group="Mavilim W")
M1= ta.wma(close, fmal)
M2= ta.wma(M1, smal)
M3= ta.wma(M2, tmal)
M4= ta.wma(M3, Fmal)
M5= ta.wma(M4, Ftmal)
MAVW= ta.wma(M5, Smal)
col1= MAVW>MAVW[1]
col3= MAVW<MAVW[1]
colorM = col1 ? color.blue : col3 ? color.red : color.yellow
plot(MAVW, color=drawM1 ? colorM:na, linewidth=2, title="MAVW")
M12= ta.wma(close, 3)
M22= ta.wma(M12, 5)
M32= ta.wma(M22, 8)
M42= ta.wma(M32, 13)
M52= ta.wma(M42, 21)
MAVW2= ta.wma(M52, 34)
plot(mavilimold and MAVW2 ? MAVW2 : na, color=color.blue, linewidth=2, title="MavWEski")



// *** Üstsel Hareketli Ortalama *****
drawEMA = input(false, title = "═══════ EMA")
ema_1p =  input(20, title="EMA 1")
ema_2p =  input(50, title="EMA 2")
ema_3p =  input(100, title="EMA 3")
ema_4p =  input(200, title="EMA 4")
ema_1 = ta.ema(close, ema_1p)
ema_2 = ta.ema(close, ema_2p)
ema_3 = ta.ema(close, ema_3p)
ema_4 = ta.ema(close, ema_4p)

plot(ema_1, color=drawEMA ? #0be630 : na, linewidth=2, title="EMA 1")
plot(ema_2, color=drawEMA ? #e41313 : na, linewidth=2, title="EMA 2")
plot(ema_3, color=drawEMA ? #f18509 : na, linewidth=2, title="EMA 3")
plot(ema_4, color=drawEMA ? #2532e9 : na, linewidth=2, title="EMA 4")


// Nadaraya-Watson Envelope [LuxAlgo]
nadara1 = input(true, title = "═══════ Nadaraya-Watson Envelope [LuxAlgo]")
//Settings
h_nada1 = input.float(8.,'Bandwidth', minval = 0)
mult_nada1 = input.float(3., minval = 0)
src = input(close, 'Source')

repaint_nada1 = input(true, 'Repainting Smoothing')

//Style
upCss = input.color(color.teal, 'Colors', inline = 'inline1', group = 'Style')
dnCss = input.color(color.red, 'Colors', inline = 'inline1', group = 'Style')

//Gaussian window
gauss(x, h_nada1) => math.exp(-(math.pow(x, 2)/(h_nada1 * h_nada1 * 2)))

//-----------------------------------------------------------------------------}
//Append lines
//-----------------------------------------------------------------------------{
n = bar_index

var ln = array.new_line(0) 

if barstate.isfirst and nadara1
    for i_nada1 = 0 to 499
        array.push(ln,line.new(na,na,na,na))

//-----------------------------------------------------------------------------}
//End point method
//-----------------------------------------------------------------------------{
var coefs = array.new_float(0)
var den = 0.

if barstate.isfirst and not nadara1
    for i_nada1 = 0 to 499
        w = gauss(i_nada1, h_nada1)
        coefs.push(w)

    den := coefs.sum()

out = 0.
if not nadara1
    for i_nada1 = 0 to 499
        out += src[i_nada1] * coefs.get(i_nada1)
out /= den
mae = ta.sma(math.abs(src - out), 499) * mult_nada1

uppernada1 = out + mae
lowernada1 = out - mae 
//-----------------------------------------------------------------------------}
//Compute and display NWE
//-----------------------------------------------------------------------------{
float y2 = na
float y1 = na

nwe = array.new<float>(0)
if barstate.islast and nadara1
    sae = 0.
    //Compute and set NWE point 
    for i_nada1 = 0 to math.min(499,n - 1)
        sum = 0.
        sumw = 0.
        //Compute weighted mean 
        for j = 0 to math.min(499,n - 1)
            w = gauss(i_nada1 - j, h_nada1)
            sum += src[j] * w
            sumw += w

        y2 := sum / sumw
        sae += math.abs(src[i_nada1] - y2)
        nwe.push(y2)
    
    sae := sae / math.min(499,n - 1) * mult_nada1
    for i_nada1 = 0 to math.min(499,n - 1)
        if i_nada1%2
            line.new(n-i_nada1+1, y1 + sae, n-i_nada1, nwe.get(i_nada1) + sae, color = upCss)
            line.new(n-i_nada1+1, y1 - sae, n-i_nada1, nwe.get(i_nada1) - sae, color = dnCss)
        
        if src[i_nada1] > nwe.get(i_nada1) + sae and src[i_nada1+1] < nwe.get(i_nada1) + sae
            label.new(n-i_nada1, src[i_nada1], 'NA▼DA', color = color(na), style = label.style_label_down, textcolor = dnCss, textalign = text.align_center)
        if src[i_nada1] < nwe.get(i_nada1) - sae and src[i_nada1+1] > nwe.get(i_nada1) - sae
            label.new(n-i_nada1, src[i_nada1], 'NA▲DA', color = color(na), style = label.style_label_up, textcolor = upCss, textalign = text.align_center)
        
        y1 := nwe.get(i_nada1)

//Plot
//-----------------------------------------------------------------------------}
plot(repaint_nada1 ? na : out + mae, 'Upper', upCss)
plot(repaint_nada1 ? na : out - mae, 'Lower', dnCss)

//Crossing Arrows
plotshape(ta.crossunder(close, out - mae) ? low : na, "Crossunder", shape.labelup, location.absolute, color(na), 90 , text = '▲', textcolor = repaint_nada1 ? na : upCss, size = size.tiny)
plotshape(ta.crossover(close, out + mae) ? high : na, "Crossover", shape.labeldown, location.absolute, color(na), 90 , text = '▼', textcolor = repaint_nada1 ? na :dnCss, size = size.tiny)


// Faytterro Bands
drawft = input(false, title = "═══════ Faytterro Bands")
srcft=input(hlc3,title="source")
len=input.int(50,title="lenght", maxval=500)

cr(x, y) =>
    z = 0.0
    weight = 0.0
    for i = 0 to y-1
        z:=z + x[i]*((y-1)/2+1-math.abs(i-(y-1)/2))
    z/(((y+1)/2)*(y+1)/2)
cr= cr(srcft,2*len-1) 

width=2

dizii = array.new_float(500)
for k=0 to len-1
    sum=0.0
    for i=0 to 2*len-2-k
        sum +=(len-math.abs(len-1-k-i))*srcft[i]/(len*len-k*(k+1)/2)
    array.set(dizii,k, sum )

mult = input.float(2.0, minval=0.001, maxval=50, title="StdDev")
dev = mult * ta.stdev(srcft, len)
upperft = cr + cr(dev, 2*len-1)
lowerft = cr - cr(dev, 2*len-1)
cu = input.color(color.rgb(255, 137, 137), "upper band color")
cl = input.color(color.rgb(137, 255, 97), "lower band color")
plot(lowerft, color=drawft ? cl:na, offset=1-len, linewidth=2, display = display.pane)
plot(upperft, color=drawft ? cu:na, offset=1-len, linewidth=2, display = display.pane)
dashed=input.bool(false)
transp=input.bool(true)
d = dashed? 2 : 1
tra=transp? 1 : 0
// extrapolation
diz = array.new_float(500)
var lin=array.new_line()
diz2 = array.new_float(500)
var lin2=array.new_line(0)
if barstate.islast and drawft
    for k=0 to len-1
        sum=0.0
        dv=0.0
        for i=0 to 2*len-2-k
            sum +=(len-math.abs(len-1-k-i))*srcft[i]/(len*len-k*(k+1)/2) 
            dv +=(len-math.abs(len-1-k-i))*dev[i]/(len*len-k*(k+1)/2)
        array.set(diz,k, sum + dv)
        array.set(diz2,k, sum - dv)
    for i=0 to (len/d-1)
        array.push(lin, line.new(na, na, na, na))
        line.set_xy1(array.get(lin,i), bar_index[len]+i*d+1, array.get(diz,i*d))
        line.set_xy2(array.get(lin,i), bar_index[len]+i*d+2, array.get(diz,i*d+1))
        line.set_color(array.get(lin,i),color.new(cu, tra*i*95/(len/d-1)))//array.get(diz,i*2+1)>=array.get(diz,i*2)?  #35cf02 : #cf0202)
        line.set_width(array.get(lin,i),width)
        array.push(lin2, line.new(na, na, na, na))
        line.set_xy1(array.get(lin2,i), bar_index[len]+i*d+1, array.get(diz2,i*d))
        line.set_xy2(array.get(lin2,i), bar_index[len]+i*d+2, array.get(diz2,i*d+1))
        line.set_color(array.get(lin2,i),color.new(cl, tra*i*95/(len/d-1)) )//array.get(diz2,i*2+1)>=array.get(diz2,i*2)?  #35cf02 : #cf0202)
        line.set_width(array.get(lin2,i),width)
plot(array.get(diz,len-1), color = color.new(drawft ? cu:na,100))
plot(array.get(diz2,len-1), color = color.new(drawft ? cl:na,100))
alertcondition(ta.crossover(close,array.get(diz,len-1)) or ta.crossunder(close,array.get(diz2,len-1)), title = "faytterro bands alert", 
 message = "warning! this is an early warning alert, not a buy or sell signal. Remember that the indicator repaints to a limited extent on the last bars.")

//Tablo
drawmultitrend = input(true, title = "═══════ Tablo")
import faiyaz7283/tools/10 as tools
import faiyaz7283/printer/6 as prnt
import faiyaz7283/multidata/7 as mltd

var section00 = 'Tablo'
//---------------------:
var header = input.string(defval='Tablo', title='Header', inline='hdr', group=section00)
var headerShow = input.bool(defval = false, title = 'Show', inline = 'hdr', group = section00)

var section01 = 'POSITION, SIZE & COLORS'
//---------------------:
var displayLoc = input.string(defval = position.bottom_right, title = 'Display Location', options = [position.top_left, 
  position.top_center, position.top_right, position.middle_left, position.middle_center, position.middle_right, 
  position.bottom_left, position.bottom_center, position.bottom_right], group = section01)

var cellPad = input.int(defval=2, title='Cell Spacing', minval=0, maxval=5, group=section01)

var orientation = input.string(defval = 'horizontal', title = 'Orientation',  options = ['horizontal', 'vertical'], 
  group = section01) == 'vertical' ? false : true 

var headerBgColor = input.color(defval=#1E283273, title = 'Header:\tBG', inline = 'hdrCl', group = section01)

var headerColor = input.color(defval=#E1E1E1 , title = 'Text', inline = 'hdrCl', group = section01)

var headerSize = input.string(defval=size.auto, title = 'Size', options = [size.auto, size.tiny, size.small, 
  size.normal, size.large, size.huge], inline = 'hdrCl', group = section01)

var headerAlign = input.string(defval=text.align_center, title = 'Align', 
  options = [text.align_left, text.align_center, text.align_right], inline = 'hdrCl', group = section01)

var titleBgColor = input.color(defval=#00000000, title = 'Title:\tBG', inline = 'ttlCl', group = section01)

var titleColor = input.color(defval=#80deea , title = 'Text', inline = 'ttlCl', group = section01)

var titleSize = input.string(defval=size.auto, title = 'Size', options = ['hide', size.auto, size.tiny, size.small, 
  size.normal, size.large, size.huge], inline = 'ttlCl', group = section01)

var titleAlign = input.string(defval=text.align_left, title = 'Align', 
  options = [text.align_left, text.align_center, text.align_right], inline = 'ttlCl', group = section01)

var keyColor = input.color(defval=#000000, title = 'Key:\tText', inline = 'keyCl', group = section01)

var keySize = input.string(defval=size.normal, title = 'Size', options = [size.auto, size.tiny, size.small, 
  size.normal, size.large, size.huge], inline = 'keyCl', group = section01)

var keyAlign = input.string(defval=text.align_center, title = 'Align', 
  options = [text.align_left, text.align_center, text.align_right], inline = 'keyCl', group = section01)

var textBgColor = input.color(defval=#00000033, title = 'Value:\tBG', inline = 'txtCl', group = section01)

var textSize = input.string(defval=size.large, title = 'Size', options = [size.auto, size.tiny, size.small, 
  size.normal, size.large, size.huge], inline = 'txtCl', group = section01)

var textAlign = input.string(defval=text.align_center, title = 'Align', 
  options = [text.align_left, text.align_center, text.align_right], inline = 'txtCl', group = section01)

var up = input.string(defval='↑', title='Up', inline = 'U', group=section01)
var upColor = input.color(defval = #00FF00, title = '', inline = 'U', group = section01)

var neutral = input.string(defval='→', title='Unchanged', inline = 'N', group=section01)
var neutralColor = input.color(defval = #fff9c4, title = '', inline = 'N', group = section01)

var down = input.string(defval='↓', title='Down', inline = 'D', group=section01)
var downColor = input.color(defval = #FF0000, title = '', inline = 'D', group = section01)

var section02 = 'TREND'
var calcTip1 = 'Close: Determine the trend direction by comparing the current close price with the close price of the '
var calcTip2 = calcTip1 + 'previous candle within the chosen timeframe.\n\nOpen: Establish the trend direction by '
var calcTip3 = calcTip2 + 'contrasting the current close price with the open price of the current candle within the '
var calcTip  = calcTip3 + 'selected timeframe.\n\nNote: "Candle" refers to each of the chosen timeframes below.'
var source = input.string(defval='close', title = 'Source', tooltip=calcTip, options = ['close', 'open'], 
  inline='dd', group = section02)

var showVol = input.bool(defval=true, title='Show Volume Trend', group=section02)

var section03 = 'TIMEFRAMES'
//--------------------------------:

var tfNote0 = "M: Multiplier | U: Unit\n\nValid Multipliers per Unit:\n- Seconds, ONLY use 1, 5, 10, 15 or 30."
var tfNote1 = tfNote0 + '\n- Minutes, 1 to 1439.\n- Days, 1 to 365.\n- Weeks, 1 to 52.\n- Months, 1 to 12.\n\n'
var tfNote2 = tfNote1 + 'N: nth candle\n\n- Nth 0 is current candle.\n- Nth 1 is previous candle.\n- Nth 2 is previous '
var tfNote = tfNote2 + '2nd candle in past.\n- Nth 3 is previous 3rd candle in past.\n ...\n\nCheck box to display.'

// Timeframe 1
var tfM1 = input.int(defval = 5, title = 'M', minval = 1, maxval = 1439, inline = 'tf1', 
  group = section03)
var tfU1 = input.string(defval = 'Minutes', title = 'U', 
  options = ['Seconds', 'Minutes', 'Days', 'Weeks', 'Months'], inline = 'tf1', group = section03)
var tfN1 = input.int(defval=0, title = 'N', minval=0, inline = 'tf1', group = section03)
var useTf1 = input.bool(defval = true, title = 'Show', tooltip = tfNote, inline = 'tf1', group = section03)

// Timeframe 2
var tfM2 = input.int(defval = 15, title = 'M', minval = 1, maxval = 1439, inline = 'tf2', 
  group = section03)
var tfU2 = input.string(defval = 'Minutes', title = 'U', 
  options = ['Seconds', 'Minutes', 'Days', 'Weeks', 'Months'], inline = 'tf2', group = section03)
var tfN2 = input.int(defval=0, title = 'N', minval=0, inline = 'tf2', group = section03)
var useTf2 = input.bool(defval = true, title = 'Show', tooltip = tfNote, inline = 'tf2', group = section03)

// Timeframe 3
var tfM3 = input.int(defval = 30, title = 'M', minval = 1, maxval = 1439, inline = 'tf3', 
  group = section03)
var tfU3 = input.string(defval = 'Minutes', title = 'U', 
  options = ['Seconds', 'Minutes', 'Days', 'Weeks', 'Months'], inline = 'tf3', group = section03)
var tfN3 = input.int(defval=0, title = 'N', minval=0, inline = 'tf3', group = section03)
var useTf3 = input.bool(defval = true, title = 'Show', tooltip = tfNote, inline = 'tf3', group = section03)

// Timeframe 4
var tfM4 = input.int(defval = 60, title = 'M', minval = 1, maxval = 1439, inline = 'tf4', 
  group = section03)
var tfU4 = input.string(defval = 'Minutes', title = 'U', 
  options = ['Seconds', 'Minutes', 'Days', 'Weeks', 'Months'], inline = 'tf4', group = section03)
var tfN4 = input.int(defval=0, title = 'N', minval=0, inline = 'tf4', group = section03)
var useTf4 = input.bool(defval = true, title = 'Show', tooltip = tfNote, inline = 'tf4', group = section03)

// Timeframe 5
var tfM5 = input.int(defval = 240, title = 'M', minval = 1, maxval = 1439, inline = 'tf5', 
  group = section03)
var tfU5 = input.string(defval = 'Minutes', title = 'U', 
  options = ['Seconds', 'Minutes', 'Days', 'Weeks', 'Months'], inline = 'tf5', group = section03)
var tfN5 = input.int(defval=0, title = 'N', minval=0, inline = 'tf5', group = section03)
var useTf5 = input.bool(defval = true, title = 'Show', tooltip = tfNote, inline = 'tf5', group = section03)

// Timeframe 6
var tfM6 = input.int(defval = 480, title = 'M', minval = 1, maxval = 1439, inline = 'tf6', 
  group = section03)
var tfU6 = input.string(defval = 'Minutes', title = 'U', 
  options = ['Seconds', 'Minutes', 'Days', 'Weeks', 'Months'], inline = 'tf6', group = section03)
var tfN6 = input.int(defval=0, title = 'N', minval=0, inline = 'tf6', group = section03)
var useTf6 = input.bool(defval = true, title = 'Show', tooltip = tfNote, inline = 'tf6', group = section03)

// Timeframe 7
var tfM7 = input.int(defval = 1, title = 'M', minval = 1, maxval = 1439, inline = 'tf7', 
  group = section03)
var tfU7 = input.string(defval = 'Days', title = 'U', 
  options = ['Seconds', 'Minutes', 'Days', 'Weeks', 'Months'], inline = 'tf7', group = section03)
var tfN7 = input.int(defval=0, title = 'N', minval=0, inline = 'tf7', group = section03)
var useTf7 = input.bool(defval = true, title = 'Show', tooltip = tfNote, inline = 'tf7', group = section03)

// Functions: {
displayTf(m, u) =>
    _m = m
    _u = switch 
        str.endswith(u, "S") => 
            m == 1 ? 'Second' : 'Seconds'
        str.endswith(u, "D") =>
            m == 1 ? 'Day' : 'Days'
        str.endswith(u, "W") =>
            m == 1 ? 'Week' : 'Weeks'
        str.endswith(u, "M") =>
            if m == 1
                'Month'
            else if m == 12
                _m := 1
                'Year'
            else
                'Months'
        =>
            if m == 1
                'Minute'
            else if m % 60 == 0
                _m := m / 60
                _m == 1 ? 'Hour' : 'Hours'
            else
                'Minutes'
    _m == 1 ? _u : str.format('{0} {1}', _m, _u)

getKv(multiplier, unit, nth) =>
    u = switch unit
        'Seconds' => 'S'
        'Minutes' => ''
        'Days' => 'D'
     
    tf = str.tostring(multiplier) + u
    srce = source == 'close' ? close[nth + 1] : open[nth]
    tckr = ticker.new(syminfo.prefix, syminfo.ticker, syminfo.session)
    [c, c1, v, v1] = request.security(tckr, tf, [close[nth], srce, volume[nth], volume[nth + 1]], ignore_invalid_symbol = true)
    dsplyPrice = c > c1 ? up : (c < c1 ? down : neutral)
    dsplyVol = v > v1 ? up : (v < v1 ? down : neutral)
    nthKey = nth > 0 ? (nth == 1 ? 'Previous ' : str.format('(Past {0}) ', tools.ordinal(nth))) : na
    key = nthKey + displayTf(multiplier, u)
    [mltd.kv(key, val=dsplyPrice), mltd.kv(key, val=dsplyVol)]

// }

if barstate.islast and drawmultitrend
    tbs = prnt.tableStyle.new(bgColor=na, frameColor=na, borderWidth=cellPad)
    hs = prnt.headerStyle.new(textHalign=headerAlign, textColor=headerColor, textSize=headerSize, bgColor=headerBgColor)
    ts = prnt.titleStyle.new(textHalign=titleAlign, textColor=titleColor, textSize=titleSize, bgColor=titleBgColor)
    kcs = prnt.cellStyle.new(textHalign=keyAlign, textSize=keySize)
    cs = prnt.cellStyle.new(horizontal=orientation, textHalign=textAlign, textSize=textSize)

    // Initialize the printer
    printer = prnt.printer(header=(headerShow ? header : na), stack=orientation, tableStyle=tbs, headerStyle=hs, 
      titleStyle=ts, keyCellStyle=kcs, cellStyle=cs, loc=displayLoc)

    // Data {
    price = array.new<mltd.kv>()
    vol = array.new<mltd.kv>()

    if useTf1
        [p, v] = getKv(tfM1, tfU1, tfN1)
        price.push(p)
        if showVol
            vol.push(v)

    if useTf2
        [p, v] = getKv(tfM2, tfU2, tfN2)
        price.push(p)
        if showVol
            vol.push(v)

    if useTf3
        [p, v] = getKv(tfM3, tfU3, tfN3)
        price.push(p)
        if showVol
            vol.push(v)

    if useTf4
        [p, v] = getKv(tfM4, tfU4, tfN4)
        price.push(p)
        if showVol
            vol.push(v)

    if useTf5
        [p, v] = getKv(tfM5, tfU5, tfN5)
        price.push(p)
        if showVol
            vol.push(v)

    if useTf6
        [p, v] = getKv(tfM6, tfU6, tfN6)
        price.push(p)
        if showVol
            vol.push(v)

    if useTf7
        [p, v] = getKv(tfM7, tfU7, tfN7)
        price.push(p)
        if showVol
            vol.push(v)
 
    if price.size() > 0
        // Store multidata
        d2dPrice = mltd.data2d(price)
        d2dVol = showVol ? mltd.data2d(vol) : na

        // Setup dynamic styles 
        d2dStyles = map.new<string, prnt.cellStyle>()
        keyStyle = prnt.cellStyle.copy(printer.keyCellStyle)
        dc = prnt.dynamicColor.new(stringUp=up, stringNeutral=neutral, stringDown=down, up=upColor, 
          neutral=neutralColor, down=downColor)
        keyStyle.dynamicColor := prnt.dynamicColor.copy(dc)
        keyStyle.dynamicColor.offsetItem :='text'
        keyStyle.dynamicColor.offsetColor := keyColor
        valStyle = prnt.cellStyle.copy(printer.cellStyle)
        valStyle.dynamicColor := prnt.dynamicColor.copy(dc)
        valStyle.dynamicColor.offsetItem := 'bg'
        valStyle.dynamicColor.offsetColor := textBgColor
        d2dStyles.put('key', keyStyle)
        d2dStyles.put('val', valStyle)

        // Output
        pTitle = titleSize != 'hide' ? 'Price' : na
        printer.print(d2dPrice, title=pTitle, styles=d2dStyles, dynamicKey=true)
        if showVol
            vTitle = titleSize != 'hide' ? 'Volume' : na
            printer.print(d2dVol, title=vTitle, styles=d2dStyles, dynamicKey=true)

    // }



//Bollinger OTT Spread','BOOTS
z12 = input(true, title = "═══════ Bollinger OTT Spread','BOOTS")
srcott = input(close, title='Source')
lengthb = input.int(2,'Bollinger Bands MA Period', minval=1)
lengthott = input.int(2, 'OTT Period', minval=1)
percent = input.float(10, 'OTT Percent', step=0.1, minval=0)
mav = input.string(title='Moving Average Type', defval='VAR', options=['SMA', 'EMA', 'WMA', 'TMA', 'VAR', 'WWMA', 'ZLEMA', 'TSF'])
showsupport = input(title="Show MOVING AVERAGE?", defval=false)
multott = 2
Var_Func(srcott, lengthott) =>
    valpha = 2 / (lengthott + 1)
    vud1 = srcott > srcott[1] ? srcott - srcott[1] : 0
    vdd1 = srcott < srcott[1] ? srcott[1] - srcott : 0
    vUD = math.sum(vud1, 9)
    vDD = math.sum(vdd1, 9)
    vCMO = nz((vUD - vDD) / (vUD + vDD))
    VAR = 0.0
    VAR := nz(valpha * math.abs(vCMO) * srcott) + (1 - valpha * math.abs(vCMO)) * nz(VAR[1])
    VAR
VAR = Var_Func(srcott, lengthott)
Wwma_Func(srcott, lengthott) =>
    wwalpha = 1 / lengthott
    WWMA = 0.0
    WWMA := wwalpha * srcott + (1 - wwalpha) * nz(WWMA[1])
    WWMA
WWMA = Wwma_Func(srcott, lengthott)
Zlema_Func(srcott, lengthott) =>
    zxLag = lengthott / 2 == math.round(lengthott / 2) ? lengthott / 2 : (lengthott - 1) / 2
    zxEMAData = srcott + srcott - srcott[zxLag]
    ZLEMA = ta.ema(zxEMAData, lengthott)
    ZLEMA
ZLEMA = Zlema_Func(srcott, lengthott)
Tsf_Func(srcott, lengthott) =>
    lrc = ta.linreg(srcott, lengthott, 0)
    lrc1 = ta.linreg(srcott, lengthott, 1)
    lrs = lrc - lrc1
    TSF = ta.linreg(srcott, lengthott, 0) + lrs
    TSF
TSF = Tsf_Func(srcott, lengthott)

ma(source, lengthott, _type) =>
    switch _type
        "SMA" => ta.sma(source, lengthott)
        "EMA" => ta.ema(source, lengthott)
        "WMA" => ta.wma(source, lengthott)
        "TMA" => ta.sma(ta.sma(source, math.ceil(lengthott / 2)), math.floor(lengthott / 2) + 1)
        "VAR" => Var_Func(source, lengthott)
        "VWMA" => ta.vwma(source, lengthott)
        "ZLEMA" => Zlema_Func(source, lengthott)
        "TSF" => Tsf_Func(source, lengthott)
        "SMMA (RMA)" => ta.rma(source, lengthott)

basis = ma(srcott, lengthb, mav)
devott = multott * ta.stdev(srcott, lengthb)
upperott = basis + devott
lowerott = basis - devott
MAvg =  ma(upperott, lengthott, mav)
fark = MAvg * percent * 0.01
longStop = MAvg - fark
longStopPrev = nz(longStop[1], longStop)
longStop := MAvg > longStopPrev ? math.max(longStop, longStopPrev) : longStop
shortStop = MAvg + fark
shortStopPrev = nz(shortStop[1], shortStop)
shortStop := MAvg < shortStopPrev ? math.min(shortStop, shortStopPrev) : shortStop
dir = 1
dir := nz(dir[1], dir)
dir := dir == -1 and MAvg > shortStopPrev ? 1 : dir == 1 and MAvg < longStopPrev ? -1 : dir
MT = dir == 1 ? longStop : shortStop
OTT = MAvg > MT ? MT * (200 + percent) / 200 : MT * (200 - percent) / 200
MAvgl =  ma(lowerott, lengthott, mav)
farkl = MAvgl * percent * 0.01
longStopl = MAvgl - farkl
longStopPrevl = nz(longStopl[1], longStopl)
longStopl := MAvgl > longStopPrevl ? math.max(longStopl, longStopPrevl) : longStopl
shortStopl = MAvgl + farkl
shortStopPrevl = nz(shortStopl[1], shortStopl)
shortStopl := MAvgl < shortStopPrevl ? math.min(shortStopl, shortStopPrevl) : shortStopl
dirl = 1
dirl := nz(dirl[1], dirl)
dirl := dirl == -1 and MAvgl > shortStopPrevl ? 1 : dirl == 1 and MAvgl < longStopPrevl ? -1 : dirl
MTl = dirl == 1 ? longStopl : shortStopl
OTTl = MAvgl > MTl ? MTl * (200 + percent) / 200 : MTl * (200 - percent) / 200


plot(OTTl[2], "BOOTSlow", color=z12 ? color.rgb(199, 56, 224):na, linewidth=2)
plot(OTT[2], "BOOTShigh", color=z12 ?  color.rgb(33, 170, 243):na, linewidth=2)
plot(showsupport ? basis : na, color=z12 ? color.new(#051be1, 0):na, linewidth=2, title="MOV")

